home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / var / lib / dpkg / info / x11-apps.postrm < prev    next >
Text File  |  2009-07-28  |  29KB  |  876 lines

  1. #!/bin/sh
  2.  
  3. set -e
  4.  
  5. THIS_PACKAGE=x11-apps
  6. THIS_SCRIPT=postrm
  7.  
  8. # $Id$
  9.  
  10. # This is the X Strike Force shell library for X Window System package
  11. # maintainer scripts.  It serves to define shell functions commonly used by
  12. # such packages, and performs some error checking necessary for proper operation
  13. # of those functions.  By itself, it does not "do" much; the maintainer scripts
  14. # invoke the functions defined here to accomplish package installation and
  15. # removal tasks.
  16.  
  17. # If you are reading this within a Debian package maintainer script (e.g.,
  18. # /var/lib/dpkg)info/PACKAGE.{config,preinst,postinst,prerm,postrm}), you can
  19. # skip past this library by scanning forward in this file to the string
  20. # "GOBSTOPPER".
  21.  
  22. SOURCE_VERSION=7.4+2
  23. OFFICIAL_BUILD=
  24.  
  25. # Use special abnormal exit codes so that problems with this library are more
  26. # easily tracked down.
  27. SHELL_LIB_INTERNAL_ERROR=86
  28. SHELL_LIB_THROWN_ERROR=74
  29. SHELL_LIB_USAGE_ERROR=99
  30.  
  31. # old -> new variable names
  32. if [ -z "$DEBUG_XORG_PACKAGE" ] && [ -n "$DEBUG_XFREE86_PACKAGE" ]; then
  33.   DEBUG_XORG_PACKAGE="$DEBUG_XFREE86_PACKAGE"
  34. fi
  35. if [ -z "$DEBUG_XORG_DEBCONF" ] && [ -n "$DEBUG_XFREE86_DEBCONF" ]; then
  36.   DEBUG_XORG_DEBCONF="$DEBUG_XFREE86_DEBCONF"
  37. fi
  38.  
  39. # initial sanity checks
  40. if [ -z "$THIS_PACKAGE" ]; then
  41.   cat >&2 <<EOF
  42. Error: package maintainer script attempted to use shell library without
  43. definining \$THIS_PACKAGE shell variable.  Please report the package name,
  44. version, and the text of this error message to the Debian Bug Tracking System.
  45. Visit <http://www.debian.org/Bugs/Reporting> on the World Wide Web for
  46. instructions, read the file /usr/share/doc/debian/bug-reporting.txt from the
  47. "doc-debian" package, or install the "reportbug" package and use the command of
  48. the same name to file a report against version $SOURCE_VERSION of this package.
  49. EOF
  50.   exit $SHELL_LIB_USAGE_ERROR
  51. fi
  52.  
  53. if [ -z "$THIS_SCRIPT" ]; then
  54.   cat >&2 <<EOF
  55. Error: package maintainer script attempted to use shell library without
  56. definining \$THIS_SCRIPT shell variable.  Please report the package name,
  57. version, and the text of this error message to the Debian Bug Tracking System.
  58. Visit <http://www.debian.org/Bugs/Reporting> on the World Wide Web for
  59. instructions, read the file /usr/share/doc/debian/bug-reporting.txt from the
  60. "doc-debian" package, or install the "reportbug" package and use the command of
  61. the same name to file a report against version $SOURCE_VERSION of the
  62. "$THIS_PACKAGE" package.
  63. EOF
  64.   exit $SHELL_LIB_USAGE_ERROR
  65. fi
  66.  
  67. if [ "$1" = "reconfigure" ] || [ -n "$DEBCONF_RECONFIGURE" ]; then
  68.   RECONFIGURE="true"
  69. else
  70.   RECONFIGURE=
  71. fi
  72.  
  73. if ([ "$1" = "install" ] || [ "$1" = "configure" ]) && [ -z "$2" ]; then
  74.   FIRSTINST="yes"
  75. fi
  76.  
  77. if [ -z "$RECONFIGURE" ] && [ -z "$FIRSTINST" ]; then
  78.   UPGRADE="yes"
  79. fi
  80.  
  81. trap "message;\
  82.       message \"Received signal.  Aborting $THIS_PACKAGE package $THIS_SCRIPT script.\";\
  83.       message;\
  84.       exit 1" HUP INT QUIT TERM
  85.  
  86. reject_nondigits () {
  87.   # syntax: reject_nondigits [ operand ... ]
  88.   #
  89.   # scan operands (typically shell variables whose values cannot be trusted) for
  90.   # characters other than decimal digits and barf if any are found
  91.   while [ -n "$1" ]; do
  92.     # does the operand contain anything but digits?
  93.     if ! expr "$1" : "[[:digit:]]\+$" > /dev/null 2>&1; then
  94.       # can't use die(), because it wraps message() which wraps this function
  95.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_nondigits() encountered" \
  96.            "possibly malicious garbage \"$1\"" >&2
  97.       exit $SHELL_LIB_THROWN_ERROR
  98.     fi
  99.     shift
  100.   done
  101. }
  102.  
  103. reject_whitespace () {
  104.   # syntax: reject_whitespace [ operand ]
  105.   #
  106.   # scan operand (typically a shell variable whose value cannot be trusted) for
  107.   # whitespace characters and barf if any are found
  108.   if [ -n "$1" ]; then
  109.     # does the operand contain any whitespace?
  110.     if expr "$1" : "[[:space:]]" > /dev/null 2>&1; then
  111.       # can't use die(), because I want to avoid forward references
  112.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_whitespace() encountered" \
  113.            "possibly malicious garbage \"$1\"" >&2
  114.       exit $SHELL_LIB_THROWN_ERROR
  115.     fi
  116.   fi
  117. }
  118.  
  119. reject_unlikely_path_chars () {
  120.   # syntax: reject_unlikely_path_chars [ operand ... ]
  121.   #
  122.   # scan operands (typically shell variables whose values cannot be trusted) for
  123.   # characters unlikely to be seen in a path and which the shell might
  124.   # interpret and barf if any are found
  125.   while [ -n "$1" ]; do
  126.     # does the operand contain any funny characters?
  127.     if expr "$1" : '.*[!$&()*;<>?|].*' > /dev/null 2>&1; then
  128.       # can't use die(), because I want to avoid forward references
  129.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_unlikely_path_chars()" \
  130.            "encountered possibly malicious garbage \"$1\"" >&2
  131.       exit $SHELL_LIB_THROWN_ERROR
  132.     fi
  133.     shift
  134.   done
  135. }
  136.  
  137. # Query the terminal to establish a default number of columns to use for
  138. # displaying messages to the user.  This is used only as a fallback in the
  139. # event the COLUMNS variable is not set.  ($COLUMNS can react to SIGWINCH while
  140. # the script is running, and this cannot, only being calculated once.)
  141. DEFCOLUMNS=$(stty size 2> /dev/null | awk '{print $2}') || true
  142. if ! expr "$DEFCOLUMNS" : "[[:digit:]]\+$" > /dev/null 2>&1; then
  143.   DEFCOLUMNS=80
  144. fi
  145.  
  146. message () {
  147.   # pretty-print messages of arbitrary length
  148.   reject_nondigits "$COLUMNS"
  149.   echo "$*" | fmt -t -w ${COLUMNS:-$DEFCOLUMNS} >&2
  150. }
  151.  
  152. observe () {
  153.   # syntax: observe message ...
  154.   #
  155.   # issue observational message suitable for logging someday when support for
  156.   # it exists in dpkg
  157.   if [ -n "$DEBUG_XORG_PACKAGE" ]; then
  158.     message "$THIS_PACKAGE $THIS_SCRIPT note: $*"
  159.   fi
  160. }
  161.  
  162. warn () {
  163.   # syntax: warn message ...
  164.   #
  165.   # issue warning message suitable for logging someday when support for
  166.   # it exists in dpkg; also send to standard error
  167.   message "$THIS_PACKAGE $THIS_SCRIPT warning: $*"
  168. }
  169.  
  170. die () {
  171.   # syntax: die message ...
  172.   #
  173.   # exit script with error message
  174.   message "$THIS_PACKAGE $THIS_SCRIPT error: $*"
  175.   exit $SHELL_LIB_THROWN_ERROR
  176. }
  177.  
  178. internal_error () {
  179.   # exit script with error; essentially a "THIS SHOULD NEVER HAPPEN" message
  180.   message "internal error: $*"
  181.   if [ -n "$OFFICIAL_BUILD" ]; then
  182.     message "Please report a bug in the $THIS_SCRIPT script of the" \
  183.             "$THIS_PACKAGE package, version $SOURCE_VERSION to the Debian Bug" \
  184.             "Tracking System.  Include all messages above that mention the" \
  185.             "$THIS_PACKAGE package.  Visit " \
  186.             "<http://www.debian.org/Bugs/Reporting> on the World Wide Web for" \
  187.             "instructions, read the file" \
  188.             "/usr/share/doc/debian/bug-reporting.txt from the doc-debian" \
  189.             "package, or install the reportbug package and use the command of" \
  190.             "the same name to file a report."
  191.   fi
  192.   exit $SHELL_LIB_INTERNAL_ERROR
  193. }
  194.  
  195. usage_error () {
  196.   message "usage error: $*"
  197.   message "Please report a bug in the $THIS_SCRIPT script of the" \
  198.           "$THIS_PACKAGE package, version $SOURCE_VERSION to the Debian Bug" \
  199.           "Tracking System.  Include all messages above that mention the" \
  200.           "$THIS_PACKAGE package.  Visit " \
  201.           "<http://www.debian.org/Bugs/Reporting> on the World Wide Web for" \
  202.           "instructions, read the file" \
  203.           "/usr/share/doc/debian/bug-reporting.txt from the doc-debian" \
  204.           "package, or install the reportbug package and use the command of" \
  205.           "the same name to file a report."
  206.   exit $SHELL_LIB_USAGE_ERROR
  207. }
  208.  
  209.  
  210. maplink () {
  211.   # returns what symlink should point to; i.e., what the "sane" answer is
  212.   # Keep this in sync with the debian/*.links files.
  213.   # This is only needed for symlinks to directories.
  214.   #
  215.   # XXX: Most of these look wrong in the X11R7 world and need to be fixed.
  216.   # If we've stopped using this function, fixing it might enable us to re-enable
  217.   # it again and catch more errors.
  218.   case "$1" in
  219.     /etc/X11/xkb/compiled) echo /var/lib/xkb ;;
  220.     /etc/X11/xkb/xkbcomp) echo /usr/X11R6/bin/xkbcomp ;;
  221.     /usr/X11R6/lib/X11/app-defaults) echo /etc/X11/app-defaults ;;
  222.     /usr/X11R6/lib/X11/fs) echo /etc/X11/fs ;;
  223.     /usr/X11R6/lib/X11/lbxproxy) echo /etc/X11/lbxproxy ;;
  224.     /usr/X11R6/lib/X11/proxymngr) echo /etc/X11/proxymngr ;;
  225.     /usr/X11R6/lib/X11/rstart) echo /etc/X11/rstart ;;
  226.     /usr/X11R6/lib/X11/twm) echo /etc/X11/twm ;;
  227.     /usr/X11R6/lib/X11/xdm) echo /etc/X11/xdm ;;
  228.     /usr/X11R6/lib/X11/xinit) echo /etc/X11/xinit ;;
  229.     /usr/X11R6/lib/X11/xkb) echo /etc/X11/xkb ;;
  230.     /usr/X11R6/lib/X11/xserver) echo /etc/X11/xserver ;;
  231.     /usr/X11R6/lib/X11/xsm) echo /etc/X11/xsm ;;
  232.     /usr/bin/X11) echo ../X11R6/bin ;;
  233.     /usr/bin/rstartd) echo ../X11R6/bin/rstartd ;;
  234.     /usr/include/X11) echo ../X11R6/include/X11 ;;
  235.     /usr/lib/X11) echo ../X11R6/lib/X11 ;;
  236.     *) internal_error "maplink() called with unknown path \"$1\"" ;;
  237.   esac
  238. }
  239.  
  240. analyze_path () {
  241.   # given a supplied set of pathnames, break each one up by directory and do an
  242.   # ls -dl on each component, cumulatively; i.e.
  243.   # analyze_path /usr/X11R6/bin -> ls -dl /usr /usr/X11R6 /usr/X11R6/bin
  244.   # Thanks to Randolph Chung for this clever hack.
  245.  
  246.   local f g
  247.  
  248.   while [ -n "$1" ]; do
  249.     reject_whitespace "$1"
  250.     g=
  251.     message "Analyzing $1:"
  252.     for f in $(echo "$1" | tr / \  ); do
  253.       if [ -e /$g$f ]; then
  254.         ls -dl /$g$f /$g$f.dpkg-* 2> /dev/null || true
  255.         g=$g$f/
  256.       else
  257.         message "/$g$f: nonexistent; directory contents of /$g:"
  258.         ls -l /$g
  259.         break
  260.       fi
  261.     done
  262.     shift
  263.   done
  264. }
  265.  
  266. find_culprits () {
  267.   local f p dpkg_info_dir possible_culprits smoking_guns bad_packages package \
  268.     msg
  269.  
  270.   reject_whitespace "$1"
  271.   message "Searching for overlapping packages..."
  272.   dpkg_info_dir=/var/lib/dpkg/info
  273.   if [ -d $dpkg_info_dir ]; then
  274.     if [ "$(echo $dpkg_info_dir/*.list)" != "$dpkg_info_dir/*.list" ]; then
  275.       possible_culprits=$(ls -1 $dpkg_info_dir/*.list | egrep -v \
  276.         "(xbase-clients|x11-common|xfs|xlibs)")
  277.       if [ -n "$possible_culprits" ]; then
  278.         smoking_guns=$(grep -l "$1" $possible_culprits || true)
  279.         if [ -n "$smoking_guns" ]; then
  280.           bad_packages=$(printf "\\n")
  281.           for f in $smoking_guns; do
  282.             # too bad you can't nest parameter expansion voodoo
  283.             p=${f%*.list}      # strip off the trailing ".list"
  284.             package=${p##*/}   # strip off the directories
  285.             bad_packages=$(printf "%s\n%s" "$bad_packages" "$package")
  286.           done
  287.           msg=$(cat <<EOF
  288. The following packages appear to have file overlaps with the X.Org packages;
  289. these packages are either very old, or in violation of Debian Policy.  Try
  290. upgrading each of these packages to the latest available version if possible:
  291. for example, with the command "apt-get install".  If no newer version of a
  292. package is available, you will have to remove it; for example, with the command
  293. "apt-get remove".  If even the latest available version of the package has
  294. this file overlap, please file a bug against that package with the Debian Bug
  295. Tracking System.  You may want to refer the package maintainer to section 12.8
  296. of the Debian Policy manual.
  297. EOF
  298. )
  299.           message "$msg"
  300.           message "The overlapping packages are: $bad_packages"
  301.         else
  302.           message "no overlaps found."
  303.         fi
  304.       fi
  305.     else
  306.       message "cannot search; no matches for $dpkg_info_dir/*.list."
  307.     fi
  308.   else
  309.     message "cannot search; $dpkg_info_dir does not exist."
  310.   fi
  311. }
  312.  
  313. check_symlink () {
  314.   # syntax: check_symlink symlink
  315.   #
  316.   # See if specified symlink points where it is supposed to.  Return 0 if it
  317.   # does, and 1 if it does not.
  318.   #
  319.   # Primarily used by check_symlinks_and_warn() and check_symlinks_and_bomb().
  320.  
  321.   local symlink
  322.  
  323.   # validate arguments
  324.   if [ $# -ne 1 ]; then
  325.     usage_error "check_symlink() called with wrong number of arguments;" \
  326.                 "expected 1, got $#"
  327.     exit $SHELL_LIB_USAGE_ERROR
  328.   fi
  329.  
  330.   symlink="$1"
  331.  
  332.   if [ "$(maplink "$symlink")" = "$(readlink "$symlink")" ]; then
  333.     return 0
  334.   else
  335.     return 1
  336.   fi
  337. }
  338.  
  339. check_symlinks_and_warn () {
  340.   # syntax: check_symlinks_and_warn symlink ...
  341.   #
  342.   # For each argument, check for symlink sanity, and warn if it isn't sane.
  343.   #
  344.   # Call this function from a preinst script in the event $1 is "upgrade" or
  345.   # "install".
  346.  
  347.   local errmsg symlink
  348.  
  349.   # validate arguments
  350.   if [ $# -lt 1 ]; then
  351.     usage_error "check_symlinks_and_warn() called with wrong number of" \
  352.                 "arguments; expected at least 1, got $#"
  353.     exit $SHELL_LIB_USAGE_ERROR
  354.   fi
  355.  
  356.   while [ -n "$1" ]; do
  357.     symlink="$1"
  358.     if [ -L "$symlink" ]; then
  359.       if ! check_symlink "$symlink"; then
  360.         observe "$symlink symbolic link points to wrong location" \
  361.                 "$(readlink "$symlink"); removing"
  362.         rm "$symlink"
  363.       fi
  364.     elif [ -e "$symlink" ]; then
  365.       errmsg="$symlink exists and is not a symbolic link; this package cannot"
  366.       errmsg="$errmsg be installed until this"
  367.       if [ -f "$symlink" ]; then
  368.         errmsg="$errmsg file"
  369.       elif [ -d "$symlink" ]; then
  370.         errmsg="$errmsg directory"
  371.       else
  372.         errmsg="$errmsg thing"
  373.       fi
  374.       errmsg="$errmsg is removed"
  375.       die "$errmsg"
  376.     fi
  377.     shift
  378.   done
  379. }
  380.  
  381. check_symlinks_and_bomb () {
  382.   # syntax: check_symlinks_and_bomb symlink ...
  383.   #
  384.   # For each argument, check for symlink sanity, and bomb if it isn't sane.
  385.   #
  386.   # Call this function from a postinst script.
  387.  
  388.   local problem symlink
  389.  
  390.   # validate arguments
  391.   if [ $# -lt 1 ]; then
  392.     usage_error "check_symlinks_and_bomb() called with wrong number of"
  393.                 "arguments; expected at least 1, got $#"
  394.     exit $SHELL_LIB_USAGE_ERROR
  395.   fi
  396.  
  397.   while [ -n "$1" ]; do
  398.     problem=
  399.     symlink="$1"
  400.     if [ -L "$symlink" ]; then
  401.       if ! check_symlink "$symlink"; then
  402.         problem=yes
  403.         warn "$symlink symbolic link points to wrong location" \
  404.              "$(readlink "$symlink")"
  405.       fi
  406.     elif [ -e "$symlink" ]; then
  407.       problem=yes
  408.       warn "$symlink is not a symbolic link"
  409.     else
  410.       problem=yes
  411.       warn "$symlink symbolic link does not exist"
  412.     fi
  413.     if [ -n "$problem" ]; then
  414.       analyze_path "$symlink" "$(readlink "$symlink")"
  415.       find_culprits "$symlink"
  416.       die "bad symbolic links on system"
  417.     fi
  418.     shift
  419.   done
  420. }
  421.  
  422. font_update () {
  423.   # run $UPDATECMDS in $FONTDIRS
  424.  
  425.   local dir cmd shortcmd x_font_dir_prefix
  426.  
  427.   x_font_dir_prefix="/usr/share/fonts/X11"
  428.  
  429.   if [ -z "$UPDATECMDS" ]; then
  430.     usage_error "font_update() called but \$UPDATECMDS not set"
  431.   fi
  432.   if [ -z "$FONTDIRS" ]; then
  433.     usage_error "font_update() called but \$FONTDIRS not set"
  434.   fi
  435.  
  436.   reject_unlikely_path_chars "$UPDATECMDS"
  437.   reject_unlikely_path_chars "$FONTDIRS"
  438.  
  439.   for dir in $FONTDIRS; do
  440.     if [ -d "$x_font_dir_prefix/$dir" ]; then
  441.       for cmd in $UPDATECMDS; do
  442.         if which "$cmd" > /dev/null 2>&1; then
  443.           shortcmd=${cmd##*/}
  444.           observe "running $shortcmd in $dir font directory"
  445.       cmd_opts=
  446.           if [ "$shortcmd" = "update-fonts-alias" ]; then
  447.             cmd_opts=--x11r7-layout
  448.           fi
  449.           if [ "$shortcmd" = "update-fonts-dir" ]; then
  450.             cmd_opts=--x11r7-layout
  451.           fi
  452.           if [ "$shortcmd" = "update-fonts-scale" ]; then
  453.             cmd_opts=--x11r7-layout
  454.           fi
  455.           $cmd $cmd_opts $dir || warn "$cmd $cmd_opts $dir" \
  456.                               "failed; font directory data may not" \
  457.                               "be up to date"
  458.         else
  459.           warn "$cmd not found; not updating corresponding $dir font" \
  460.                "directory data"
  461.         fi
  462.       done
  463.     else
  464.       warn "$dir is not a directory; not updating font directory data"
  465.     fi
  466.   done
  467. }
  468.  
  469. remove_conffile_prepare () {
  470.   # syntax: remove_conffile_prepare filename official_md5sum ...
  471.   #
  472.   # Check a conffile "filename" against a list of canonical MD5 checksums.
  473.   # If the file's current MD5 checksum matches one of the "official_md5sum"
  474.   # operands provided, then prepare the conffile for removal from the system.
  475.   # We defer actual deletion until the package is configured so that we can
  476.   # roll this operation back if package installation fails.
  477.   #
  478.   # Call this function from a preinst script in the event $1 is "upgrade" or
  479.   # "install" and verify $2 to ensure the package is being upgraded from a
  480.   # version (or installed over a version removed-but-not-purged) prior to the
  481.   # one in which the conffile was obsoleted.
  482.  
  483.   local conffile current_checksum
  484.  
  485.   # validate arguments
  486.   if [ $# -lt 2 ]; then
  487.     usage_error "remove_conffile_prepare() called with wrong number of" \
  488.                 "arguments; expected at least 2, got $#"
  489.     exit $SHELL_LIB_USAGE_ERROR
  490.   fi
  491.  
  492.   conffile="$1"
  493.   shift
  494.  
  495.   # does the conffile even exist?
  496.   if [ -e "$conffile" ]; then
  497.     # calculate its checksum
  498.     current_checksum=$(md5sum < "$conffile" | sed 's/[[:space:]].*//')
  499.     # compare it to each supplied checksum
  500.     while [ -n "$1" ]; do
  501.       if [ "$current_checksum" = "$1" ]; then
  502.         # we found a match; move the confffile and stop looking
  503.         observe "preparing obsolete conffile $conffile for removal"
  504.         mv "$conffile" "$conffile.$THIS_PACKAGE-tmp"
  505.         break
  506.       fi
  507.       shift
  508.     done
  509.   fi
  510. }
  511.  
  512. remove_conffile_lookup () {
  513.   # syntax: remove_conffile_lookup package filename
  514.   #
  515.   # Lookup the md5sum of a conffile in dpkg's database, and prepare for removal
  516.   # if it matches the actual file's md5sum.
  517.   #
  518.   # Call this function when you would call remove_conffile_prepare but only
  519.   # want to check against dpkg's status database instead of known checksums.
  520.  
  521.   local package conffile old_md5sum
  522.  
  523.   # validate arguments
  524.   if [ $# -ne 2 ]; then
  525.     usage_error "remove_conffile_lookup() called with wrong number of" \
  526.                 "arguments; expected 1, got $#"
  527.     exit $SHELL_LIB_USAGE_ERROR
  528.   fi
  529.  
  530.   package="$1"
  531.   conffile="$2"
  532.  
  533.   if ! [ -e "$conffile" ]; then
  534.     return
  535.   fi
  536.   old_md5sum="$(dpkg-query -W -f='${Conffiles}' "$package" | \
  537.     awk '{ if (match($0, "^ '"$conffile"' ")) print $2}')"
  538.   if [ -n "$old_md5sum" ]; then
  539.     remove_conffile_prepare "$conffile" "$old_md5sum"
  540.   fi
  541. }
  542.  
  543. remove_conffile_commit () {
  544.   # syntax: remove_conffile_commit filename
  545.   #
  546.   # Complete the removal of a conffile "filename" that has become obsolete.
  547.   #
  548.   # Call this function from a postinst script after having used
  549.   # remove_conffile_prepare() in the preinst.
  550.  
  551.   local conffile
  552.  
  553.   # validate arguments
  554.   if [ $# -ne 1 ]; then
  555.     usage_error "remove_conffile_commit() called with wrong number of" \
  556.                 "arguments; expected 1, got $#"
  557.     exit $SHELL_LIB_USAGE_ERROR
  558.   fi
  559.  
  560.   conffile="$1"
  561.  
  562.   # if the temporary file created by remove_conffile_prepare() exists, remove it
  563.   if [ -e "$conffile.$THIS_PACKAGE-tmp" ]; then
  564.     observe "committing removal of obsolete conffile $conffile"
  565.     rm "$conffile.$THIS_PACKAGE-tmp"
  566.   fi
  567. }
  568.  
  569. remove_conffile_rollback () {
  570.   # syntax: remove_conffile_rollback filename
  571.   #
  572.   # Roll back the removal of a conffile "filename".
  573.   #
  574.   # Call this function from a postrm script in the event $1 is "abort-upgrade"
  575.   # or "abort-install" is  after having used remove_conffile_prepare() in the
  576.   # preinst.
  577.  
  578.   local conffile
  579.  
  580.   # validate arguments
  581.   if [ $# -ne 1 ]; then
  582.     usage_error "remove_conffile_rollback() called with wrong number of" \
  583.                 "arguments; expected 1, got $#"
  584.     exit $SHELL_LIB_USAGE_ERROR
  585.   fi
  586.  
  587.   conffile="$1"
  588.  
  589.   # if the temporary file created by remove_conffile_prepare() exists, move it
  590.   # back
  591.   if [ -e "$conffile.$THIS_PACKAGE-tmp" ]; then
  592.     observe "rolling back removal of obsolete conffile $conffile"
  593.     mv "$conffile.$THIS_PACKAGE-tmp" "$conffile"
  594.   fi
  595. }
  596.  
  597. replace_conffile_with_symlink_prepare () {
  598.   # syntax: replace_conffile_with_symlink_prepare oldfilename newfilename \
  599.   # official_md5sum ...
  600.   #
  601.   # Check a conffile "oldfilename" against a list of canonical MD5 checksums.
  602.   # If the file's current MD5 checksum matches one of the "official_md5sum"
  603.   # operands provided, then prepare the conffile for removal from the system.
  604.   # We defer actual deletion until the package is configured so that we can
  605.   # roll this operation back if package installation fails. Otherwise copy it
  606.   # to newfilename and let dpkg handle it through conffiles mechanism.
  607.   #
  608.   # Call this function from a preinst script in the event $1 is "upgrade" or
  609.   # "install" and verify $2 to ensure the package is being upgraded from a
  610.   # version (or installed over a version removed-but-not-purged) prior to the
  611.   # one in which the conffile was obsoleted.
  612.  
  613.   local conffile current_checksum
  614.  
  615.   # validate arguments
  616.   if [ $# -lt 3 ]; then
  617.     usage_error "replace_conffile_with_symlink_prepare() called with wrong" \
  618.                 " number of arguments; expected at least 3, got $#"
  619.     exit $SHELL_LIB_USAGE_ERROR
  620.   fi
  621.  
  622.   oldconffile="$1"
  623.   shift
  624.   newconffile="$1"
  625.   shift
  626.  
  627.   remove_conffile_prepare "$_oldconffile" "$@"
  628.   # If $oldconffile still exists, then md5sums didn't match.
  629.   # Copy it to new one.
  630.   if [ -f "$oldconffile" ]; then
  631.     cp "$oldconffile" "$newconffile"
  632.   fi
  633.  
  634. }
  635.  
  636. replace_conffile_with_symlink_commit () {
  637.   # syntax: replace_conffile_with_symlink_commit oldfilename
  638.   #
  639.   # Complete the removal of a conffile "oldfilename" that has been
  640.   # replaced by a symlink.
  641.   #
  642.   # Call this function from a postinst script after having used
  643.   # replace_conffile_with_symlink_prepare() in the preinst.
  644.  
  645.   local conffile
  646.  
  647.   # validate arguments
  648.   if [ $# -ne 1 ]; then
  649.     usage_error "replace_conffile_with_symlink_commit() called with wrong" \
  650.                 "number of arguments; expected 1, got $#"
  651.     exit $SHELL_LIB_USAGE_ERROR
  652.   fi
  653.  
  654.   conffile="$1"
  655.  
  656.   remove_conffile_commit "$conffile"
  657. }
  658.  
  659. replace_conffile_with_symlink_rollback () {
  660.   # syntax: replace_conffile_with_symlink_rollback oldfilename newfilename
  661.   #
  662.   # Roll back the replacing of a conffile "oldfilename" with symlink to
  663.   # "newfilename".
  664.   #
  665.   # Call this function from a postrm script in the event $1 is "abort-upgrade"
  666.   # or "abort-install" and verify $2 to ensure the package failed to upgrade
  667.   # from a version (or install over a version removed-but-not-purged) prior
  668.   # to the one in which the conffile was obsoleted.
  669.   # You should have  used replace_conffile_with_symlink_prepare() in the
  670.   # preinst.
  671.  
  672.   local conffile
  673.  
  674.   # validate arguments
  675.   if [ $# -ne 2 ]; then
  676.     usage_error "replace_conffile_with_symlink_rollback() called with wrong" \
  677.                 "number of arguments; expected 2, got $#"
  678.     exit $SHELL_LIB_USAGE_ERROR
  679.   fi
  680.  
  681.   oldconffile="$1"
  682.   newconffile="$2"
  683.  
  684.   remove_conffile_rollback "$_oldconffile"
  685.   if [ -f "$newconffile" ]; then
  686.     rm "$newconffile"
  687.   fi
  688. }
  689.  
  690. run () {
  691.   # syntax: run command [ argument ... ]
  692.   #
  693.   # Run specified command with optional arguments and report its exit status.
  694.   # Useful for commands whose exit status may be nonzero, but still acceptable,
  695.   # or commands whose failure is not fatal to us.
  696.   #
  697.   # NOTE: Do *not* use this function with db_get or db_metaget commands; in
  698.   # those cases the return value of the debconf command *must* be checked
  699.   # before the string returned by debconf is used for anything.
  700.  
  701.   local retval
  702.  
  703.   # validate arguments
  704.   if [ $# -lt 1 ]; then
  705.     usage_error "run() called with wrong number of arguments; expected at" \
  706.                 "least 1, got $#"
  707.     exit $SHELL_LIB_USAGE_ERROR
  708.   fi
  709.  
  710.   "$@" || retval=$?
  711.  
  712.   if [ ${retval:-0} -ne 0 ]; then
  713.     observe "command \"$*\" exited with status $retval"
  714.   fi
  715. }
  716.  
  717. make_symlink_sane () {
  718.   # syntax: make_symlink_sane symlink target
  719.   #
  720.   # Ensure that the symbolic link symlink exists, and points to target.
  721.   #
  722.   # If symlink does not exist, create it and point it at target.
  723.   #
  724.   # If symlink exists but is not a symbolic link, back it up.
  725.   #
  726.   # If symlink exists, is a symbolic link, but points to the wrong location, fix
  727.   # it.
  728.   #
  729.   # If symlink exists, is a symbolic link, and already points to target, do
  730.   # nothing.
  731.   #
  732.   # This function wouldn't be needed if ln had an -I, --idempotent option.
  733.  
  734.   # Validate arguments.
  735.   if [ $# -ne 2 ]; then
  736.     usage_error "make_symlink_sane() called with wrong number of arguments;" \
  737.       "expected 2, got $#"
  738.     exit $SHELL_LIB_USAGE_ERROR
  739.   fi
  740.  
  741.   # We could just use the positional parameters as-is, but that makes things
  742.   # harder to follow.
  743.   local symlink target
  744.  
  745.   symlink="$1"
  746.   target="$2"
  747.  
  748.   if [ -L "$symlink" ] && [ "$(readlink "$symlink")" = "$target" ]; then
  749.       observe "link from $symlink to $target already exists"
  750.   else
  751.     observe "creating symbolic link from $symlink to $target"
  752.     mkdir -p "${target%/*}" "${symlink%/*}"
  753.     ln -s -b -S ".dpkg-old" "$target" "$symlink"
  754.   fi
  755. }
  756.  
  757. migrate_dir_to_symlink () {
  758.   # syntax: migrate_dir_to_symlink old_location new_location
  759.   #
  760.   # Per Debian Policy section 6.5.4, "A directory will never be replaced by a
  761.   # symbolic link to a directory or vice versa; instead, the existing state
  762.   # (symlink or not) will be left alone and dpkg will follow the symlink if
  763.   # there is one."
  764.   #
  765.   # We have to do it ourselves.
  766.   #
  767.   # This function moves the contents of old_location, a directory, into
  768.   # new_location, a directory, then makes old_location a symbolic link to
  769.   # new_location.
  770.   #
  771.   # old_location need not exist, but if it does, it must be a directory (or a
  772.   # symlink to a directory).  If it is not, it is backed up.  If new_location
  773.   # exists already and is not a directory, it is backed up.
  774.   #
  775.   # This function should be called from a package's preinst so that other
  776.   # packages unpacked after this one --- but before this package's postinst runs
  777.   # --- are unpacked into new_location even if their payloads contain
  778.   # old_location filespecs.
  779.  
  780.   # Validate arguments.
  781.   if [ $# -ne 2 ]; then
  782.     usage_error "migrate_dir_to_symlink() called with wrong number of"
  783.                 "arguments; expected 2, got $#"
  784.     exit $SHELL_LIB_USAGE_ERROR
  785.   fi
  786.  
  787.   # We could just use the positional parameters as-is, but that makes things
  788.   # harder to follow.
  789.   local new old
  790.  
  791.   old="$1"
  792.   new="$2"
  793.  
  794.   # Is old location a symlink?
  795.   if [ -L "$old" ]; then
  796.     # Does it already point to new location?
  797.     if [ "$(readlink "$old")" = "$new" ]; then
  798.       # Nothing to do; migration has already been done.
  799.       observe "migration of $old to $new already done"
  800.       return 0
  801.     else
  802.       # Back it up.
  803.       warn "backing up symbolic link $old as $old.dpkg-old"
  804.       mv -b "$old" "$old.dpkg-old"
  805.     fi
  806.   fi
  807.  
  808.   # Does old location exist, but is not a directory?
  809.   if [ -e "$old" ] && ! [ -d "$old" ]; then
  810.       # Back it up.
  811.       warn "backing up non-directory $old as $old.dpkg-old"
  812.       mv -b "$old" "$old.dpkg-old"
  813.   fi
  814.  
  815.   observe "migrating $old to $new"
  816.  
  817.   # Is new location a symlink?
  818.   if [ -L "$new" ]; then
  819.     # Does it point the wrong way, i.e., back to where we're migrating from?
  820.     if [ "$(readlink "$new")" = "$old" ]; then
  821.       # Get rid of it.
  822.       observe "removing symbolic link $new which points to $old"
  823.       rm "$new"
  824.     else
  825.       # Back it up.
  826.       warn "backing up symbolic link $new as $new.dpkg-old"
  827.       mv -b "$new" "$new.dpkg-old"
  828.     fi
  829.   fi
  830.  
  831.   # Does new location exist, but is not a directory?
  832.   if [ -e "$new" ] && ! [ -d "$new" ]; then
  833.     warn "backing up non-directory $new as $new.dpkg-old"
  834.     mv -b "$new" "$new.dpkg-old"
  835.   fi
  836.  
  837.   # Create new directory if it does not yet exist.
  838.   if ! [ -e "$new" ]; then
  839.     observe "creating $new"
  840.     mkdir -p "$new"
  841.   fi
  842.  
  843.   # Copy files in old location to new location.  Back up any filenames that
  844.   # already exist in the new location with the extension ".dpkg-old".
  845.   observe "copying files from $old to $new"
  846.   if ! (cd "$old" && cp -a -b -S ".dpkg-old" . "$new"); then
  847.     die "error(s) encountered while copying files from $old to $new"
  848.   fi
  849.  
  850.   # Remove files at old location.
  851.   observe "removing $old"
  852.   rm -r "$old"
  853.  
  854.   # Create symlink from old location to new location.
  855.   make_symlink_sane "$old" "$new"
  856. }
  857.  
  858. # vim:set ai et sw=2 ts=2 tw=80:
  859.  
  860. # GOBSTOPPER: The X Strike Force shell library ends here.
  861.  
  862. case "$1" in
  863.   abort-install|abort-upgrade)
  864.   if dpkg --compare-versions "$2" lt-nl "7.3+4"; then
  865.     remove_conffile_rollback "/etc/X11/app-defaults/Xedit"
  866.     remove_conffile_rollback "/etc/X11/app-defaults/Xedit-color"
  867.   fi
  868. esac
  869.  
  870. # Automatically added by dh_installmenu
  871. if [ -x "`which update-menus 2>/dev/null`" ]; then update-menus ; fi
  872. # End automatically added section
  873.  
  874.  
  875. # vim:set ai et sts=2 sw=2 tw=0:
  876.